🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / node / src / main / kotlin / org / meshtastic / feature / node / metrics / PowerMetrics.kt
Displaying Raw • Download
feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt 78274c792318331b11ab64cd28e58e829875b8c2 (78274c79) Text, 16.20 KB
T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.node.metrics
Tff7b72import T7ee787androidx.compose.foundation.Canvas
Tff7b72import T7ee787androidx.compose.foundation.horizontalScroll
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxHeight
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.width
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.items
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.text.selection.SelectionContainer
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Surface
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.collectAsState
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.graphics.Path
Tff7b72import T7ee787androidx.compose.ui.graphics.StrokeCap
Tff7b72import T7ee787androidx.compose.ui.graphics.drawscope.Stroke
Tff7b72import T7ee787androidx.compose.ui.platform.LocalDensity
Tff7b72import T7ee787androidx.compose.ui.platform.LocalWindowInfo
Tff7b72import T7ee787androidx.compose.ui.text.TextStyle
Tff7b72import T7ee787androidx.compose.ui.text.font.FontWeight
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787org.jetbrains.compose.resources.StringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.strings.Res
Tff7b72import T7ee787org.meshtastic.core.strings.channel_1
Tff7b72import T7ee787org.meshtastic.core.strings.channel_2
Tff7b72import T7ee787org.meshtastic.core.strings.channel_3
Tff7b72import T7ee787org.meshtastic.core.strings.current
Tff7b72import T7ee787org.meshtastic.core.strings.voltage
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.component.OptionLabel
Tff7b72import T7ee787org.meshtastic.core.ui.component.SlidingSelector
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.InfantryBlue
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Red
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.CommonCharts.DATE_TIME_FORMAT
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.CommonCharts.MS_PER_SEC
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.GraphUtil.createPath
Tff7b72import T7ee787org.meshtastic.feature.node.model.TimeFrame
Tff7b72import T7ee787org.meshtastic.proto.TelemetryProtos.Telemetry
Tff7b72import T7ee787kotlin.math.ceil
Tff7b72import T7ee787kotlin.math.floor
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72enum Tff7b72class T56d364PowerTb4b4b4(Tff7b72val Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4, Tff7b72val Te6edf3minTb4b4b4: Tffa657FloatTb4b4b4, Tff7b72val Te6edf3maxTb4b4b4: Tffa657FloatTb4b4b4) Tb4b4b4{
Te6edf3CURRENTTb4b4b4(Te6edf3InfantryBlueTb4b4b4, Tff7b72-T79c0ff5T79c0ff0T79c0ff0fTb4b4b4, T79c0ff5T79c0ff0T79c0ff0fTb4b4b4)Tb4b4b4,
Tb4b4b4;
T8b949e/** Difference between the metrics `max` and `min` values. */
Tff7b72fun Td2a8ffdifferenceTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3max Tff7b72- Te6edf3min
Tb4b4b4}
Tff7b72private Tff7b72enum Tff7b72class T56d364PowerChannelTb4b4b4(Tff7b72val Te6edf3strResTb4b4b4: Te6edf3StringResourceTb4b4b4) Tb4b4b4{
Te6edf3ONETb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_1Tb4b4b4)Tb4b4b4,
Te6edf3TWOTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_2Tb4b4b4)Tb4b4b4,
Te6edf3THREETb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_3Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72private Tff7b72const Tff7b72val Te6edf3CHART_WEIGHT Tff7b72= T79c0ff1f
Tff7b72private Tff7b72const Tff7b72val Te6edf3Y_AXIS_WEIGHT Tff7b72= T79c0ff0.1f
Tff7b72private Tff7b72const Tff7b72val Te6edf3CHART_WIDTH_RATIO Tff7b72= Te6edf3CHART_WEIGHT Tff7b72/ Tb4b4b4(Te6edf3CHART_WEIGHT Tff7b72+ Te6edf3Y_AXIS_WEIGHT Tff7b72+ Te6edf3Y_AXIS_WEIGHTTb4b4b4)
Tff7b72private Tff7b72const Tff7b72val Te6edf3VOLTAGE_STICK_TO_ZERO_RANGE Tff7b72= T79c0ff2f
Tff7b72private Tff7b72val Te6edf3VOLTAGE_COLOR Tff7b72= Te6edf3Red
Tff7b72fun Td2a8ffminMaxGraphVoltageTb4b4b4(Te6edf3valueMinTb4b4b4: Tffa657FloatTb4b4b4, Te6edf3valueMaxTb4b4b4: Tffa657FloatTb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Tffa657FloatTb4b4b4, Tffa657FloatTff7b72> Tb4b4b4{
Tff7b72val Te6edf3valueMin Tff7b72= Te6edf3floorTb4b4b4(Te6edf3valueMinTb4b4b4)
Tff7b72val Te6edf3min Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3valueMin Tff7b72=Tff7b72= T79c0ff0f Tff7b72|Tff7b72| Tb4b4b4(Te6edf3valueMin Tff7b72>Tff7b72= T79c0ff0f Tff7b72&Tff7b72& Te6edf3valueMin Tff7b72- Te6edf3VOLTAGE_STICK_TO_ZERO_RANGE Tff7b72<Tff7b72= T79c0ff0fTb4b4b4)Tb4b4b4) Tb4b4b4{
T79c0ff0f
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3valueMin Tff7b72- Te6edf3VOLTAGE_STICK_TO_ZERO_RANGE
Tb4b4b4}
Tff7b72val Te6edf3max Tff7b72= Te6edf3ceilTb4b4b4(Te6edf3valueMaxTb4b4b4)
Tff7b72return Te6edf3PairTb4b4b4(Te6edf3minTb4b4b4, Te6edf3maxTb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3LEGEND_DATA Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3currentTb4b4b4, Te6edf3color Tff7b72= Te6edf3PowerTb4b4b4.Te6edf3CURRENTTb4b4b4.Te6edf3colorTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4, Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3voltageTb4b4b4, Te6edf3color Tff7b72= Te6edf3VOLTAGE_COLORTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4, Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffPowerMetricsScreenTb4b4b4(Te6edf3viewModelTb4b4b4: Te6edf3MetricsViewModel Tff7b72= Te6edf3hiltViewModelTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3selectedTimeFrame Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3timeFrameTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3selectedChannel Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Te6edf3PowerChannelTb4b4b4.Te6edf3ONETb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3data Tff7b72= Te6edf3stateTb4b4b4.Te6edf3powerMetricsFilteredTb4b4b4(Te6edf3selectedTimeFrameTb4b4b4)
Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stateTb4b4b4.Te6edf3nodeTff7b72?.Te6edf3userTff7b72?.Te6edf3longName Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3ourNode Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3showNodeChip Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3innerPadding Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3innerPaddingTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3PowerMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3fillMaxHeightTb4b4b4(Te6edf3fraction Tff7b72= T79c0ff0.33fTb4b4b4)Tb4b4b4,
Te6edf3telemetries Tff7b72= Te6edf3dataTb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedTimeFrameTb4b4b4,
Te6edf3selectedChannelTb4b4b4,
Tb4b4b4)
Te6edf3SlidingSelectorTb4b4b4(
Te6edf3PowerChannelTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedChannelTb4b4b4,
Te6edf3onOptionSelected Tff7b72= Tb4b4b4{ Te6edf3selectedChannel Tff7b72= Tffa657it Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3OptionLabelTb4b4b4(Te6edf3stringResourceTb4b4b4(Tffa657itTb4b4b4.Te6edf3strResTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3SlidingSelectorTb4b4b4(
Te6edf3TimeFrameTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedTimeFrameTb4b4b4,
Te6edf3onOptionSelected Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3setTimeFrameTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3OptionLabelTb4b4b4(Te6edf3stringResourceTb4b4b4(Tffa657itTb4b4b4.Te6edf3strResTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3itemsTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3telemetry Tff7b72-Tff7b72> Te6edf3PowerMetricsCardTb4b4b4(Te6edf3telemetryTb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPowerMetricsChartTb4b4b4(
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3telemetriesTb4b4b4: Te6edf3ListTff7b72<Te6edf3TelemetryTff7b72>Tb4b4b4,
Te6edf3selectedTimeTb4b4b4: Te6edf3TimeFrameTb4b4b4,
Te6edf3selectedChannelTb4b4b4: Te6edf3PowerChannelTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ChartHeaderTb4b4b4(Te6edf3amount Tff7b72= Te6edf3telemetriesTb4b4b4.Te6edf3sizeTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3telemetriesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return
Tb4b4b4}
Tff7b72val Tb4b4b4(Te6edf3oldestTb4b4b4, Te6edf3newestTb4b4b4) Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3key1 Tff7b72= Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3PairTb4b4b4(Te6edf3telemetriesTb4b4b4.Te6edf3minBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4, Te6edf3telemetriesTb4b4b4.Te6edf3maxBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3timeDiff Tff7b72= Te6edf3newestTb4b4b4.Te6edf3time Tff7b72- Te6edf3oldestTb4b4b4.Te6edf3time
Tff7b72val Te6edf3scrollState Tff7b72= Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3screenWidth Tff7b72= Te6edf3LocalWindowInfoTb4b4b4.Te6edf3currentTb4b4b4.Te6edf3containerSizeTb4b4b4.Te6edf3width
Tff7b72val Te6edf3dp Tff7b72by
Te6edf3rememberTb4b4b4(Te6edf3key1 Tff7b72= Te6edf3selectedTimeTb4b4b4) Tb4b4b4{
Te6edf3mutableStateOfTb4b4b4(Te6edf3selectedTimeTb4b4b4.Te6edf3dpTb4b4b4(Te6edf3screenWidthTb4b4b4, Te6edf3time Tff7b72= Tb4b4b4(Te6edf3newestTb4b4b4.Te6edf3time Tff7b72- Te6edf3oldestTb4b4b4.Te6edf3timeTb4b4b4)Tb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}
T8b949e// Calculate visible time range based on scroll position and chart width
Tff7b72val Te6edf3visibleTimeRange Tff7b72= Te6edf3run Tb4b4b4{
Tff7b72val Te6edf3totalWidthPx Tff7b72= Te6edf3withTb4b4b4(Te6edf3LocalDensityTb4b4b4.Te6edf3currentTb4b4b4) Tb4b4b4{ Te6edf3dpTb4b4b4.Te6edf3toPxTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3scrollPx Tff7b72= Te6edf3scrollStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)
T8b949e// Calculate visible width based on actual weight distribution
Tff7b72val Te6edf3visibleWidthPx Tff7b72= Te6edf3screenWidth Tff7b72* Te6edf3CHART_WIDTH_RATIO
Tff7b72val Te6edf3leftRatio Tff7b72= Tb4b4b4(Te6edf3scrollPx Tff7b72/ Te6edf3totalWidthPxTb4b4b4)Tb4b4b4.Te6edf3coerceInTb4b4b4(T79c0ff0fTb4b4b4, T79c0ff1fTb4b4b4)
Tff7b72val Te6edf3rightRatio Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3scrollPx Tff7b72+ Te6edf3visibleWidthPxTb4b4b4) Tff7b72/ Te6edf3totalWidthPxTb4b4b4)Tb4b4b4.Te6edf3coerceInTb4b4b4(T79c0ff0fTb4b4b4, T79c0ff1fTb4b4b4)
T8b949e// With reverseScrolling = true, scrolling right shows older data (left side of chart)
Tff7b72val Te6edf3visibleOldest Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3time Tff7b72+ Tb4b4b4(Te6edf3timeDiff Tff7b72* Tb4b4b4(T79c0ff1f Tff7b72- Te6edf3rightRatioTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3visibleNewest Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3time Tff7b72+ Tb4b4b4(Te6edf3timeDiff Tff7b72* Tb4b4b4(T79c0ff1f Tff7b72- Te6edf3leftRatioTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3visibleOldest Te6edf3to Te6edf3visibleNewest
Tb4b4b4}
Te6edf3TimeLabelsTb4b4b4(Te6edf3oldest Tff7b72= Te6edf3visibleTimeRangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3newest Tff7b72= Te6edf3visibleTimeRangeTb4b4b4.Te6edf3secondTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3graphColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurface
Tff7b72val Te6edf3currentDiff Tff7b72= Te6edf3PowerTb4b4b4.Te6edf3CURRENTTb4b4b4.Te6edf3differenceTb4b4b4(Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3voltageMinTb4b4b4, Te6edf3voltageMaxTb4b4b4) Tff7b72=
Te6edf3minMaxGraphVoltageTb4b4b4(
Te6edf3retrieveVoltageTb4b4b4(Te6edf3selectedChannelTb4b4b4, Te6edf3telemetriesTb4b4b4.Te6edf3minBy Tb4b4b4{ Te6edf3retrieveVoltageTb4b4b4(Te6edf3selectedChannelTb4b4b4, Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3retrieveVoltageTb4b4b4(Te6edf3selectedChannelTb4b4b4, Te6edf3telemetriesTb4b4b4.Te6edf3maxBy Tb4b4b4{ Te6edf3retrieveVoltageTb4b4b4(Te6edf3selectedChannelTb4b4b4, Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3voltageDiff Tff7b72= Te6edf3voltageMax Tff7b72- Te6edf3voltageMin
Te6edf3Row Tb4b4b4{
Te6edf3YAxisLabelsTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3weightTb4b4b4(Te6edf3weight Tff7b72= Te6edf3Y_AXIS_WEIGHTTb4b4b4)Tb4b4b4,
Te6edf3PowerTb4b4b4.Te6edf3CURRENTTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3minValue Tff7b72= Te6edf3PowerTb4b4b4.Te6edf3CURRENTTb4b4b4.Te6edf3minTb4b4b4,
Te6edf3maxValue Tff7b72= Te6edf3PowerTb4b4b4.Te6edf3CURRENTTb4b4b4.Te6edf3maxTb4b4b4,
Tb4b4b4)
Te6edf3BoxTb4b4b4(
Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3TopStartTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3horizontalScrollTb4b4b4(Te6edf3state Tff7b72= Te6edf3scrollStateTb4b4b4, Te6edf3reverseScrolling Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3HorizontalLinesOverlayTb4b4b4(Te6edf3modifierTb4b4b4.Te6edf3widthTb4b4b4(Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3lineColors Tff7b72= Te6edf3ListTb4b4b4(Te6edf3size Tff7b72= T79c0ff5Tb4b4b4) Tb4b4b4{ Te6edf3graphColor Tb4b4b4}Tb4b4b4)
Te6edf3TimeAxisOverlayTb4b4b4(Te6edf3modifierTb4b4b4.Te6edf3widthTb4b4b4(Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3oldest Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3timeTb4b4b4, Te6edf3newest Tff7b72= Te6edf3newestTb4b4b4.Te6edf3timeTb4b4b4, Te6edf3selectedTimeTb4b4b4.Te6edf3lineIntervalTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e/* Plot */
Te6edf3CanvasTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3widthTb4b4b4(Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3width Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3width
Tff7b72val Te6edf3height Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3height
T8b949e/* Voltage */
Tff7b72var Te6edf3index Tff7b72= T79c0ff0
Tff7b72while Tb4b4b4(Te6edf3index Tff7b72< Te6edf3telemetriesTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3path Tff7b72= Te6edf3PathTb4b4b4(Tb4b4b4)
Te6edf3index Tff7b72=
Te6edf3createPathTb4b4b4(
Te6edf3telemetries Tff7b72= Te6edf3telemetriesTb4b4b4,
Te6edf3index Tff7b72= Te6edf3indexTb4b4b4,
Te6edf3path Tff7b72= Te6edf3pathTb4b4b4,
Te6edf3oldestTime Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3timeTb4b4b4,
Te6edf3timeRange Tff7b72= Te6edf3timeDiffTb4b4b4,
Te6edf3width Tff7b72= Te6edf3widthTb4b4b4,
Te6edf3timeThreshold Tff7b72= Te6edf3selectedTimeTb4b4b4.Te6edf3timeThresholdTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3i Tff7b72-Tff7b72>
Tff7b72val Te6edf3telemetry Tff7b72= Te6edf3telemetriesTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3iTb4b4b4) Tff7b72?: Te6edf3telemetriesTb4b4b4.Te6edf3lastTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3ratio Tff7b72= Tb4b4b4(Te6edf3retrieveVoltageTb4b4b4(Te6edf3selectedChannelTb4b4b4, Te6edf3telemetryTb4b4b4) Tff7b72- Te6edf3voltageMinTb4b4b4) Tff7b72/ Te6edf3voltageDiff
Tff7b72val Te6edf3y Tff7b72= Te6edf3height Tff7b72- Tb4b4b4(Te6edf3ratio Tff7b72* Te6edf3heightTb4b4b4)
Tff7b72returnTf0883e@createPath Te6edf3y
Tb4b4b4}
Te6edf3drawPathTb4b4b4(
Te6edf3path Tff7b72= Te6edf3pathTb4b4b4,
Te6edf3color Tff7b72= Te6edf3VOLTAGE_COLORTb4b4b4,
Te6edf3style Tff7b72= Te6edf3StrokeTb4b4b4(Te6edf3width Tff7b72= Te6edf3GraphUtilTb4b4b4.Te6edf3RADIUSTb4b4b4, Te6edf3cap Tff7b72= Te6edf3StrokeCapTb4b4b4.Te6edf3RoundTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e/* Current */
Te6edf3index Tff7b72= T79c0ff0
Tff7b72while Tb4b4b4(Te6edf3index Tff7b72< Te6edf3telemetriesTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3path Tff7b72= Te6edf3PathTb4b4b4(Tb4b4b4)
Te6edf3index Tff7b72=
Te6edf3createPathTb4b4b4(
Te6edf3telemetries Tff7b72= Te6edf3telemetriesTb4b4b4,
Te6edf3index Tff7b72= Te6edf3indexTb4b4b4,
Te6edf3path Tff7b72= Te6edf3pathTb4b4b4,
Te6edf3oldestTime Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3timeTb4b4b4,
Te6edf3timeRange Tff7b72= Te6edf3timeDiffTb4b4b4,
Te6edf3width Tff7b72= Te6edf3widthTb4b4b4,
Te6edf3timeThreshold Tff7b72= Te6edf3selectedTimeTb4b4b4.Te6edf3timeThresholdTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3i Tff7b72-Tff7b72>
Tff7b72val Te6edf3telemetry Tff7b72= Te6edf3telemetriesTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3iTb4b4b4) Tff7b72?: Te6edf3telemetriesTb4b4b4.Te6edf3lastTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3ratio Tff7b72= Tb4b4b4(Te6edf3retrieveCurrentTb4b4b4(Te6edf3selectedChannelTb4b4b4, Te6edf3telemetryTb4b4b4) Tff7b72- Te6edf3PowerTb4b4b4.Te6edf3CURRENTTb4b4b4.Te6edf3minTb4b4b4) Tff7b72/ Te6edf3currentDiff
Tff7b72val Te6edf3y Tff7b72= Te6edf3height Tff7b72- Tb4b4b4(Te6edf3ratio Tff7b72* Te6edf3heightTb4b4b4)
Tff7b72returnTf0883e@createPath Te6edf3y
Tb4b4b4}
Te6edf3drawPathTb4b4b4(
Te6edf3path Tff7b72= Te6edf3pathTb4b4b4,
Te6edf3color Tff7b72= Te6edf3PowerTb4b4b4.Te6edf3CURRENTTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3style Tff7b72= Te6edf3StrokeTb4b4b4(Te6edf3width Tff7b72= Te6edf3GraphUtilTb4b4b4.Te6edf3RADIUSTb4b4b4, Te6edf3cap Tff7b72= Te6edf3StrokeCapTb4b4b4.Te6edf3RoundTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3YAxisLabelsTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3weightTb4b4b4(Te6edf3weight Tff7b72= Te6edf3Y_AXIS_WEIGHTTb4b4b4)Tb4b4b4,
Te6edf3VOLTAGE_COLORTb4b4b4,
Te6edf3minValue Tff7b72= Te6edf3voltageMinTb4b4b4,
Te6edf3maxValue Tff7b72= Te6edf3voltageMaxTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3LegendTb4b4b4(Te6edf3legendData Tff7b72= Te6edf3LEGEND_DATATb4b4b4, Te6edf3displayInfoIcon Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPowerMetricsCardTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3time Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3time Tff7b72* Te6edf3MS_PER_SEC
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3Surface Tb4b4b4{
Te6edf3SelectionContainer Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e/* Time */
Te6edf3Row Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3DATE_TIME_FORMATTb4b4b4.Te6edf3formatTb4b4b4(Te6edf3timeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)Tb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3RowTb4b4b4(Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3hasCh1CurrentTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3hasCh1VoltageTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3PowerChannelColumnTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_1Tb4b4b4,
Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch1VoltageTb4b4b4,
Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch1CurrentTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3hasCh2CurrentTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3hasCh2VoltageTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3PowerChannelColumnTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_2Tb4b4b4,
Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch2VoltageTb4b4b4,
Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch2CurrentTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3hasCh3CurrentTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3hasCh3VoltageTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3PowerChannelColumnTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_3Tb4b4b4,
Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch3VoltageTb4b4b4,
Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch3CurrentTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPowerChannelColumnTb4b4b4(Te6edf3titleResTb4b4b4: Te6edf3StringResourceTb4b4b4, Te6edf3voltageTb4b4b4: Tffa657FloatTb4b4b4, Te6edf3currentTb4b4b4: Tffa657FloatTb4b4b4) Tb4b4b4{
Te6edf3Column Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3titleResTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)Tb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ff%.2fVTa5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3voltageTb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ff%.1fmATa5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3currentTb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/** Retrieves the appropriate voltage depending on `channelSelected`. */
Tff7b72private Tff7b72fun Td2a8ffretrieveVoltageTb4b4b4(Te6edf3channelSelectedTb4b4b4: Te6edf3PowerChannelTb4b4b4, Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Tff7b72when Tb4b4b4(Te6edf3channelSelectedTb4b4b4) Tb4b4b4{
Te6edf3PowerChannelTb4b4b4.Te6edf3ONE Tff7b72-Tff7b72> Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch1Voltage
Te6edf3PowerChannelTb4b4b4.Te6edf3TWO Tff7b72-Tff7b72> Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch2Voltage
Te6edf3PowerChannelTb4b4b4.Te6edf3THREE Tff7b72-Tff7b72> Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch3Voltage
Tb4b4b4}
T8b949e/** Retrieves the appropriate current depending on `channelSelected`. */
Tff7b72private Tff7b72fun Td2a8ffretrieveCurrentTb4b4b4(Te6edf3channelSelectedTb4b4b4: Te6edf3PowerChannelTb4b4b4, Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Tff7b72when Tb4b4b4(Te6edf3channelSelectedTb4b4b4) Tb4b4b4{
Te6edf3PowerChannelTb4b4b4.Te6edf3ONE Tff7b72-Tff7b72> Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch1Current
Te6edf3PowerChannelTb4b4b4.Te6edf3TWO Tff7b72-Tff7b72> Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch2Current
Te6edf3PowerChannelTb4b4b4.Te6edf3THREE Tff7b72-Tff7b72> Te6edf3telemetryTb4b4b4.Te6edf3powerMetricsTb4b4b4.Te6edf3ch3Current
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.22s